package org.example;

import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.Iterator;
import java.util.function.Consumer;

/**
 * 动态数组
 * 作者：祝鑫
 * 时间：2025-5-30
 */

@Slf4j
public class DynamicsArray implements Iterable<Integer> {
    private int size = 0;//逻辑大小，用来表示该数组当前大小
    private int capacity = 8;//容量，用来表示该数组最多可存放多少内容
    private int[] array = new int[capacity];
    private String INDEX_ERROR = "索引目标不合法";

    /**
     * 向数组尾部插入数据
     * @param element 插入目标值
     *
     */
    public void addLast(int element) {
       add(size, element);
    }

    /**
     * 向数组指定位置插入目标值
     * @param index 插入位置的索引
     * @param element 插入的目标值
     */
    public void add(int index, int element){

        //检查容量
        chackAndGrown();
        if (index < 0 || index > size) {
            log.error("错误{}", INDEX_ERROR);
            throw new IndexOutOfBoundsException(INDEX_ERROR);
        }else {
            System.arraycopy(array,index,
                    array,index+1,
                    size-index);
            array[index] = element;
            size++;
        }

    }

    /**
     * 检查容量是否充足，扩容
     */
    private void chackAndGrown() {
        if (size == capacity) {
           capacity +=capacity >> 1;
           int[] newArray = new int[capacity];
           System.arraycopy(array, 0, newArray, 0, size);
           array = newArray;
        }
    }

    /**
     * 根据索引查询数组内元素
     * @param index 0<=index<size
     * @return 数组中索引对应元素
     */
    public int getNum(int index) {
        return array[index];
    }

    /**
     * 循环数组
     * @param consumer
     */
    public void foreach(Consumer<Integer> consumer ) {
        for (int i = 0; i < size-1; i++) {
            //System.out.println("第"+i+"个元素为"+array[i]);
            //提供array[i]
            //返回viod
            consumer.accept(array[i]);

        }
    }

    /**
     * 使用迭代器遍历
     * @return
     */
    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            int i = 0;
            @Override
            public boolean hasNext() {//在编历时询问有没有下一个元素

                return i < size;
            }

            @Override
            public Integer next() { //返回当前元素，同时移动到下一个元素
                return array[i++];
            }
        };
    }

    /**
     * 删除元素
     * @param index
     * @return
     */
    public int removes(int index){
        int removed = array[index];
        if (index < size-1) {
            System.arraycopy(array,index+1,array,index,size-index-1);
            size--;

        }else{
            size--;
        }
        return removed;
    }
}
